package mu.node.rexweather.app.Services;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Looper;
import rx.Observable;
import rx.Subscriber;
/**
* Implement an Rx-style location service by wrapping the Android LocationManager and providing
* the location result as an Observable.
*/
public class LocationService {
private final LocationManager mLocationManager;
public LocationService(LocationManager locationManager) {
mLocationManager = locationManager;
}
public Observable<Location> getLocation() {
return Observable.create(new Observable.OnSubscribe<Location>() {
@Override
public void call(final Subscriber<? super Location> subscriber) {
final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(final Location location) {
subscriber.onNext(location);
subscriber.onCompleted();
Looper.myLooper().quit();
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
}
};
final Criteria locationCriteria = new Criteria();
locationCriteria.setAccuracy(Criteria.ACCURACY_COARSE);
locationCriteria.setPowerRequirement(Criteria.POWER_LOW);
final String locationProvider = mLocationManager
.getBestProvider(locationCriteria, true);
Looper.prepare();
mLocationManager.requestSingleUpdate(locationProvider,
locationListener, Looper.myLooper());
Looper.loop();
}
});
}
}